import electronLog from 'electron-log';
import path from 'node:path';
import { app } from 'electron';

/**
 * 日志类别枚举
 */
export enum LogCategory {
  /** 系统级别日志，包括应用启动、关闭、崩溃等系统事件 */
  SYSTEM = 'SYSTEM',
  /** 标签页相关日志，包括标签的创建、关闭、切换、刷新等操作 */
  TAB = 'TAB',
  /** 窗口相关日志，包括窗口的创建、关闭、最大化、最小化等操作 */
  WINDOW = 'WINDOW',
  /** 导航相关日志，包括页面导航、前进、后退、URL加载等操作 */
  NAVIGATION = 'NAVIGATION',
  /** 数据库相关日志，包括数据库连接、查询、更新等操作 */
  DATABASE = 'DATABASE',
  /** 进程间通信相关日志，包括IPC消息的发送与接收 */
  IPC = 'IPC',
  /** 渲染进程相关日志，包括页面渲染、DOM操作等 */
  RENDERER = 'RENDERER',
  /** 文件操作相关日志，包括文件的读取、写入、删除等操作 */
  FILE = 'FILE',
  /** 网络请求相关日志，包括HTTP请求、WebSocket连接等 */
  NETWORK = 'NETWORK'
}

/**
 * 日志服务类
 * 提供应用程序日志记录功能
 */
class LoggerService {
  private static instance: LoggerService;
  public logger: typeof electronLog;

  private constructor() {
    // 配置日志
    this.logger = electronLog;

    // 设置日志文件路径
    this.logger.transports.file.resolvePathFn = () => {
      return path.join(app.getPath('logs'), 'chromalift.log');
    };

    // 设置日志级别
    this.logger.transports.file.level = 'info';
    this.logger.transports.console.level = process.env.NODE_ENV === 'development' ? 'debug' : 'info';

    // 设置日志格式，增加模块和分类标识
    this.logger.transports.file.format = '{y}-{m}-{d} {h}:{i}:{s}.{ms} [{level}] {text}';
    this.logger.transports.console.format = '[{level}] {text}';
    
    // 设置日志文件滚动策略 (5MB)
    this.logger.transports.file.maxSize = 5 * 1024 * 1024;
    
    // 设置日志文件归档策略 (自定义处理)
    this.setupLogRotation();
  }

  /**
   * 设置日志文件轮转，可以定期清理或归档旧日志文件
   * 注: 这里只是预留一个hook，实际归档逻辑需要另外实现
   */
  private setupLogRotation(): void {
    // 可以在这里实现自定义的日志文件归档逻辑
    // 例如使用第三方库或手动实现定期清理旧日志文件
  }

  /**
   * 获取日志服务实例
   */
  public static getInstance(): LoggerService {
    if (!LoggerService.instance) {
      LoggerService.instance = new LoggerService();
    }
    return LoggerService.instance;
  }

  /**
   * 格式化日志消息
   * @param module 模块名称
   * @param category 日志类别
   * @param message 日志消息
   */
  private formatMessage(module: string, category: LogCategory, message: string): string {
    return `[${module}][${category}] ${message}`;
  }

  /**
   * 记录信息日志
   * @param module 模块名称
   * @param category 日志类别
   * @param message 日志信息
   * @param optionalParams 附加参数
   */
  public info(module: string, category: LogCategory, message: string, ...optionalParams: any[]): void {
    this.logger.info(this.formatMessage(module, category, message), ...optionalParams);
  }

  /**
   * 记录警告日志
   * @param module 模块名称
   * @param category 日志类别
   * @param message 日志信息
   * @param optionalParams 附加参数
   */
  public warn(module: string, category: LogCategory, message: string, ...optionalParams: any[]): void {
    this.logger.warn(this.formatMessage(module, category, message), ...optionalParams);
  }

  /**
   * 记录错误日志
   * @param module 模块名称
   * @param category 日志类别
   * @param message 日志信息
   * @param optionalParams 附加参数
   */
  public error(module: string, category: LogCategory, message: string, ...optionalParams: any[]): void {
    this.logger.error(this.formatMessage(module, category, message), ...optionalParams);
  }

  /**
   * 记录调试日志
   * @param module 模块名称
   * @param category 日志类别
   * @param message 日志信息
   * @param optionalParams 附加参数
   */
  public debug(module: string, category: LogCategory, message: string, ...optionalParams: any[]): void {
    this.logger.debug(this.formatMessage(module, category, message), ...optionalParams);
  }
}

// 导出日志服务实例
export const logger = LoggerService.getInstance();
